#!/usr/bin/env python
# coding: utf-8

# In[ ]:


import pandas as pd 
import pymysql

# 获取用户信息
try:
    conn = pymysql.connect(host="localhost", user="test", passwd="123456", db='course', charset="utf8")
    cursor = conn.cursor()
    print("数据库连接成功！")
except Exception as e:
    print(e)

sql = 'select * from 6_task_training_master;'
try:
    cursor.execute(sql)
    res = cursor.fetchall()
    cols = [cursor.description[i][0] for i in range(len(cursor.description))]
    df = pd.DataFrame(res, columns=cols)
    print("数据获取成功！")
    cursor.close()
    conn.commit()
    conn.close()
except Exception as e:
    print(e)
    

import argparse
import numpy as np

# 初始化参数构造器
parser = argparse.ArgumentParser()

# 在参数构造器中添加两个命令行参数
parser.add_argument('--filename', type=str,default="文件")

# 获取所有的命令行参数
args = parser.parse_args(args=[])
#args=[]

filename = args.filename # 文件名


# In[144]:


df2 = df.copy()
# 计算是否逾期个数
temp = df2.target.value_counts()
# 计算每个用户信息缺失个数
is_null_sum = df2.isnull().sum(axis=1)

# 创建逾期信息和信息缺失数表
df3 = pd.DataFrame(list(zip(is_null_sum.index, is_null_sum.values)), columns=["用户ID", "信息缺失数"])
df3["用户ID"] = df2.Idx  # 重置用户ID
df3["是否逾期"] = df2.target  # 添加是否逾期列
df3.sort_values(by='信息缺失数', ascending=True, inplace=True, ignore_index=True)

# 可视化
import warnings;warnings.filterwarnings("ignore")
from matplotlib import pyplot as plt
import seaborn as sns
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# sns.set()
plt.figure(figsize=(20, 8), dpi=100)

# 信息缺失数分布情况
plt.subplot(121)
sns.kdeplot(y=df3["信息缺失数"],color="orange")
plt.title("信息缺失数分布情况", fontdict={"fontsize":20})
plt.xlabel("密度", fontdict={"fontsize":20})
plt.ylabel("信息缺失数", fontdict={"fontsize":20})

# 信息缺失数和逾期率之间的关系
plt.subplot(122)
df4 = df3[~((df3["信息缺失数"]>10) | (df3["信息缺失数"]<2))]  # 剔除缺失个数大于10或者小于2的样本

# 定义分组函数
def get_num(x):
    if x >= 2 and x <= 4:
        return "2~4"
    elif x >= 5 and x <= 7:
        return "5~7"
    else:
        return "8~10"
    
df4["分组"] = df4["信息缺失数"].map(get_num)

p = []
for i in list(df4["分组"].value_counts().index):
    g1 = df4[df4["分组"] == i]  # 当前分组
    p1 = len(g1[g1["是否逾期"] == 1])/len(g1) # 计算当前分组逾期率
    p.append(p1)
    
df_fraud = pd.DataFrame(list(zip(list(df4["分组"].value_counts().index), p)), columns=["分组", "逾期率"]).sort_values(by="逾期率", ascending=True)
sns.barplot(x=df_fraud["分组"], y=df_fraud["逾期率"])
plt.title("信息缺失情况和逾期率之间的关系", fontdict={"fontsize":20})
plt.tight_layout()
plt.xlabel("分组",fontdict={"fontsize":20})
plt.ylabel("逾期率",fontdict={"fontsize":20})
# plt.show()
plt.savefig(filename + ".png")  # 保存路径，若是html文件，则将 ".png" 换成 ".html"

